#ifndef STACK_H
#define STACK_H
#include <stack>
#include <iostream>
#include <string>
#include "Operation.h"

#if defined(NBL_STATICLIB)
#  define STRCK_API
#elif defined(WIN32) || defined(_WIN32)
#  if defined(NBL_EXPORTS)
#    define STRCK_API  __declspec(dllexport)
#  else
#    define STRCK_API  __declspec(dllimport)
#  endif
#else
#  define   STRCK_API
#endif

//#define STRCK_API __declspec(dllexport)

using namespace std;

/*******************************************************************************
*类名：Stack
*功能：对Stack类中的各种函数、对外接口以及变量进行声明
*作者：韦锴祖
*日期：2018年12月8号
********************************************************************************/

class STRCK_API Stack{
public:
	Stack();
	~Stack();                          /**< 析构函数 */
	void setPostfix(string exp);       /**< 中缀表达式转后缀表达式接口 */
	void setCalResults();              /**< 表达式计算接口 */
	void clearPostfix();               /**< 清除 m_Postfix 容器中的后缀表达式接口 */
	double getResult();                /**< 获取计算结果接口 */
	string getPostfix();               /**< 获取后缀表达式接口 */


private:
	Operation* oper;                   /**< 指向Operation类的指针 */
	string m_Postfix;                  /**< 存储后缀表达式 */
	double m_Result;                   /**< 存储计算结果 */
	stack<char> opStack;               /**< 运算符栈 */
	int getPriority(const char ch);    /**< 定义运算符等级 */
	void toPostfix(string strExp);     /**< 中缀表达式转换成后缀表达式 */
	void calResults();                 /**< 计算后缀表达式 */
	double convertStringToDouble(const string &s);   /**< string转double */

};

#endif // STACK_H

